package vip.liux.backend.adapter.web;

import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import vip.liux.application.dots.ListResultDto;
import vip.liux.application.dots.PagedResultDto;
import vip.liux.backend.application.service.pay.PayRefundService;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundCreateDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundDetailsDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundPageItemDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundQueryDto;
import vip.liux.contracts.infrastructure.pay.dto.refund.ClientPayRefundDto;

/**
 * 退款订单管理 API
 */
@RestController
@RequestMapping("/api/pay/refund")
public class PayRefundController {

    @Resource
    private PayRefundService payRefundService;

    /**
     * 根据退款订单编号获取退款订单详情
     *
     * @param id 退款订单编号
     * @return 退款订单详情
     */
    @GetMapping("/{id}")
    public PayRefundDetailsDto getRefund(@PathVariable Long id) {
        return payRefundService.getRefund(id);
    }

    /**
     * 根据外部退款单号获取退款订单详情
     *
     * @param refundNo 外部退款单号
     * @return 退款订单详情
     */
    @GetMapping("/refundNo/{refundNo}")
    public PayRefundDetailsDto getRefundByRefundNo(@PathVariable String refundNo) {
        return payRefundService.getRefundByRefundNo(refundNo);
    }

    /**
     * 获取指定应用的退款订单数量
     *
     * @param appId 应用编号
     * @return 退款订单数量
     */
    @GetMapping("/count")
    public Long getRefundCountByAppId(@RequestParam Long appId) {
        return payRefundService.getRefundCountByAppId(appId);
    }

    /**
     * 分页查询退款订单
     *
     * @param pageDto 分页查询参数
     * @return 退款订单分页结果
     */
    @GetMapping("/page")
    public PagedResultDto<PayRefundPageItemDto> getRefundPage(PayRefundQueryDto pageDto) {
        return payRefundService.getRefundPage(pageDto);
    }

    /**
     * 查询退款订单列表（用于导出）
     *
     * @param exportReqVO 查询条件
     * @return 退款订单列表
     */
    @GetMapping("/export")
    public ListResultDto<PayRefundPageItemDto> getRefundList(PayRefundQueryDto exportReqVO) {
        return payRefundService.getRefundList(exportReqVO);
    }

    /**
     * 创建退款申请
     *
     * @param input 退款申请信息
     * @return 退款订单编号
     */
    @PostMapping
    public String createRefund(@RequestBody PayRefundCreateDto input) {
        return payRefundService.createRefund(input);
    }

    /**
     * 接收渠道的退款通知
     *
     * @param channelId 渠道编号
     * @param notify    通知内容
     */
    @PostMapping("/notify/{channelId}")
    public void notifyRefund(@PathVariable Long channelId, @RequestBody ClientPayRefundDto notify) {
        payRefundService.notifyRefund(channelId, notify);
    }

    /**
     * 同步渠道退款状态
     *
     * @return 同步到状态的退款订单数量
     */
    @PostMapping("/sync")
    public int syncRefund() {
        return payRefundService.syncRefund();
    }
}